package org.finesys.message.producer;

import lombok.RequiredArgsConstructor;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.stereotype.Component;
import org.springframework.util.MimeType;

/**
 * 生产者发送消息的工具类
 *
 * spring:
 *   cloud:
 *     stream:
 *       bindings:
 *         ## 新版本固定格式  函数名-{out/in}-{index}
 *         demoChannel-out-0:
 *           destination: stream-test-topic
 */
@Component("mqProducer")
@RequiredArgsConstructor
public class MqProducer {
    private final StreamBridge streamBridge;

    /**
     * 发送数据到指定的绑定名。
     *
     * @param bindingName 绑定名，指定要发送到的目的地。destination-out-0
     * @param data        要发送的数据对象。
     * @return 如果数据成功发送，则返回true；否则返回false。
     */
    public boolean send(String bindingName, Object data) {
        return streamBridge.send(bindingName, data);
    }

    /**
     * 发送数据到指定的绑定名，并指定输出内容的MIME类型。
     *
     * @param bindingName       绑定名，指定要发送到的目的地。destination-out-0
     * @param data              要发送的数据对象。
     * @param outputContentType 数据的MIME类型。例如：application/json, text/plain等。
     * @return 如果数据成功发送，则返回true；否则返回false。
     */
    public boolean send(String bindingName, Object data, MimeType outputContentType) {
        return streamBridge.send(bindingName, data, outputContentType);
    }

    /**
     * 发送数据到指定的绑定名，并指定绑定的名称。
     *
     * @param bindingName 绑定名，指定要发送到的目的地。destination-out-0
     * @param binderName  绑定的名称，用于区分不同的消息通道或队列。
     * @param data        要发送的数据对象。
     * @return 如果数据成功发送，则返回true；否则返回false。
     */
    public boolean send(String bindingName, String binderName, Object data) {
        return streamBridge
                .send(bindingName, binderName, data);
    }

    /**
     * 发送数据到指定的绑定名，并指定绑定的名称和输出内容的MIME类型。
     *
     * @param bindingName       绑定名，指定要发送到的目的地。destination-out-0
     * @param binderName        绑定的名称，用于区分不同的消息通道或队列。
     * @param data              要发送的数据对象。
     * @param outputContentType 数据的MIME类型。例如：application/json, text/plain等。
     * @return 如果数据成功发送，则返回true；否则返回false
     */
    public boolean send(String bindingName, String binderName, Object data, MimeType outputContentType) {
        return streamBridge.send(bindingName, binderName, data, outputContentType);
    }

}